[BITS 16]
[CPU 286]

global _get_contrast
global _set_contrast
global _set_page
global _clr_page
global _clr_pages
global _set_mode
global _disp_bmp
global _suppr_int9
global _restor_int9
global _clr_kbuf
global _caskey

%ifndef BCC
[SEGMENT _TEXT class=CODE]
%else
[SECTION .text]
%endif

;******************************************************************************
;**  Set the graphic mode                                                    **
;******************************************************************************
_set_mode:
  mov bx, sp
  mov ax, [ss:bx+2]
  out 2, al
ret

;******************************************************************************
;**  Clears the keyboard buffer                                              **
;******************************************************************************
_clr_kbuf:
.tst_kbuf:
  mov ah,1
  int 0x16
jz .fin_kbuf
  xor ah,ah
  int 0x16
jmp .tst_kbuf
.fin_kbuf:
ret

;******************************************************************************
;**  Wait for a key to be pressed                                            **
;******************************************************************************
_caskey:
  xor ax, ax
  int 16h
ret


;******************************************************************************
;**  Lire le contraste de la graph100 (merci a Swifter pour cette fonction)  **
;**  < contraste (uchar)                                                     **
;******************************************************************************
_get_contrast:
  push es
  mov ax,0x40
  mov es,ax
  mov al,[es:0xE5]
  sub al,0x12
  shr al,1
  pop es
ret

;******************************************************************************
;**  Régler le contraste de la graph100 (merci a Swifter pour cette fonction)**
;**  > contraste (uchar)                                                     **
;******************************************************************************
_set_contrast:
  mov bx, sp
  mov ax, [ss:bx+2]
push bp
  push es
;   push word 0x40
;   pop es
  mov bx, 0x40
  mov es,bx
  xor ah,ah
  shl al,0x1
  add ax,0x2210
  mov [es:0xE5],al
  xor bl,bl
  int 0x7C
  pop es
pop bp
ret

;******************************************************************************
;**  Changer la page video                                                   **
;**  > adresse de la page a afficher (ushort)                                **
;******************************************************************************
_set_page:
  mov bx, sp
  mov ax, [ss:bx+2]
  mov dx,ax
  and dx,0xF000
  shr dx,12
  shl ax,4
  out 05h,ax
  mov al,dl
  out 07h,al
ret

;******************************************************************************
;**  Nettoyer une page video                                                 **
;**  > adresse de la page a nettoyer (ushort)                                **
;******************************************************************************
_clr_page:
  mov bx, sp
  mov ax, [ss:bx+2]
  cld
  mov es,ax
  xor di,di
  mov cx,512
  xor ax,ax
  rep stosw
ret

;******************************************************************************
;**  Nettoyer les 4 pages 0x1A20 - 0x1A80                                    **
;******************************************************************************
_clr_pages:
  cld
  mov ax,1A20h
  mov es,ax
  xor di,di
  mov cx,2048
  xor ax,ax
  rep stosw
ret

;******************************************************************************
;**  Afficher une image en mode 0xD3                                         **
;**  > ds:si : image a afficher                                              **
;**  > es:di : segment video                                                 **
;******************************************************************************
_disp_bmp:
  mov bx, sp
  mov si, [ss:bx+2]
  mov di, [ss:bx+4]

  cld
  mov bx, 0x1A20
  mov es, bx
  mov cx,512
  rep movsw
ret

;******************************************************************************
;** Suppression de l'interruption clavier                                    **
;******************************************************************************
_suppr_int9:
push es
  ;On vire l'interruption du clavier
  mov ah,35h                ; Get int
  mov al,9h
  int 21h
  mov [old_int],es          ; On stocke l'adresse pour retaurer l'int
  mov [old_int+2],bx

  mov ah,25h                ; Set int : vide
  mov al,9h
  mov dx,new_int
  int 21h

pop es
ret


;******************************************************************************
;** Restauration de l'interruption clavier                                   **
;******************************************************************************
_restor_int9:
  mov ah,25h                ; Restaurer l'interruption
  mov al,9h
  mov dx,[old_int+2]
  mov bx,[old_int]
  push ds
  mov ds,bx
  int 21h
  pop ds
ret

%ifndef BCC
[SEGMENT _DATA class=DATA]
%else
[SECTION .data]
%endif


old_int:
  resw 2
new_int:
; Interruption vide
  iret
